package br.com.seuimovelnamao.dao;

import java.security.NoSuchAlgorithmException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;

import br.com.seuimovelnamao.cryptography.Cryptography;
import br.com.seuimovelnamao.cryptography.CryptographyMD5;
import br.com.seuimovelnamao.model.Usuario;


public class UsuarioDAO extends MasterDAO {

	public UsuarioDAO(Session session) {
		super(session);
	}

	public Usuario getUsuario(Long id){
		return (Usuario) this.getSession().load(Usuario.class, id);
	}
	
	public Usuario getUsuarioPorEmail(Usuario usuario){
		
		Query query = this.getSession().createQuery("SELECT u FROM Usuario AS u WHERE u.email = :paramEmail");
		return (Usuario)query.setParameter("paramEmail", usuario.getEmail()).uniqueResult();
		
	}
	
	@Override
	public void salva(Object o) throws Exception{
		Usuario u = (Usuario)o;
		
		//Criptografa a senha na hora de salvar
		Cryptography cryptography = new CryptographyMD5();
		u.setSenha(cryptography.encrypt(u.getSenha()));
		
		super.salva(u);
	}
	
	public void remove(Usuario u){
		this.getSession().delete(u);
	}
	
	@Override
	public void atualiza(Object o) throws Exception{
		Usuario u = (Usuario)o;
		
		//Criptografa a senha na hora de salvar
		Cryptography cryptography = new CryptographyMD5();
		u.setSenha(cryptography.encrypt(u.getSenha()));
				
		super.atualiza(u);
	}
	
	public List<Usuario> listaTudo(){
		return this.getSession().createCriteria(Usuario.class).list();
	}
	
	public List<Usuario> pagina(int inicio, int quantidade){
		return this.getSession().createCriteria(Usuario.class).setMaxResults(quantidade).setFirstResult(inicio).list();
	}
	
	public boolean usuarioExiste(Usuario usuario) throws HibernateException, NoSuchAlgorithmException{
		
		Cryptography cryptography = new CryptographyMD5();
		
		usuario.setSenha(cryptography.encrypt(usuario.getSenha()));
		
		return usuarioExisteSenhaCriptografada(usuario);
	}

	public boolean usuarioExisteSenhaCriptografada(Usuario usuario) throws HibernateException, NoSuchAlgorithmException{
		
		Query query = this.getSession().createQuery("SELECT u FROM Usuario AS u WHERE u.email = :email AND u.senha = :senha");
		Usuario u = (Usuario)query.setParameter("email", usuario.getEmail()).setParameter("senha", usuario.getSenha()).uniqueResult();
		
		return (u == null) ? false : true;
	}

	public List<Usuario> getCorretores(Usuario usuario) {
		
		Query query = this.getSession().createQuery("SELECT u FROM Usuario AS u WHERE u.owner = :usuario");
		return query.setParameter("usuario", usuario).list();
		
	}
	
}
